package com.nikolaj.kuzan.test;

import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Locale;

import jxl.CellView;
import jxl.Workbook;
import jxl.WorkbookSettings;
import jxl.format.UnderlineStyle;
import jxl.write.Formula;
import jxl.write.Label;
import jxl.write.Number;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;


public class WriteExcel {

    private WritableCellFormat timesBoldUnderline;
    private WritableCellFormat times;
    private String inputFile;

    public void setOutputFile(String inputFile) {
        this.inputFile = inputFile;
    }

    public void write(List<List<Double>> similarityMatrix) throws IOException, WriteException {
        File file = new File(inputFile);
        //Если требуемого файла не существует.
        if(!file.exists()) {
            //Создаем его.

            file.getParentFile().mkdirs();
            file.createNewFile();
            if (file.exists()){
                System.out.println(file.getAbsolutePath());
            }
        }

        WorkbookSettings wbSettings = new WorkbookSettings();

        wbSettings.setLocale(new Locale("en", "EN"));

        WritableWorkbook workbook = Workbook.createWorkbook(file, wbSettings);
        workbook.createSheet("Report", 0);
        WritableSheet excelSheet = workbook.getSheet(0);
        createLabel(excelSheet, similarityMatrix);
        createContent(excelSheet, similarityMatrix);

        workbook.write();
        workbook.close();
    }

    private void createLabel(WritableSheet sheet, List<List<Double>> similarityMatrix) throws WriteException {
        // Lets create a times font
        WritableFont times10pt = new WritableFont(WritableFont.TIMES, 10);
        // Define the cell format
        times = new WritableCellFormat(times10pt);
        // Lets automatically wrap the cells
        times.setWrap(true);

        // create create a bold font with unterlines
        WritableFont times10ptBoldUnderline = new WritableFont(WritableFont.TIMES, 10, WritableFont.BOLD, false);
        timesBoldUnderline = new WritableCellFormat(times10ptBoldUnderline);
        // Lets automatically wrap the cells
        timesBoldUnderline.setWrap(true);

        CellView cv = new CellView();
        cv.setFormat(times);
        cv.setFormat(timesBoldUnderline);
        cv.setAutosize(true);

        // Write a few headers
        for(int i = 0; i < similarityMatrix.size(); i++){
            addCaption(sheet, i+1, 0, i*10+"%");
            if (i == 0){
                addCaption(sheet, i, 1, "A");
                addCaption(sheet, i, 2, "Б");
                addCaption(sheet, i, 3, "И");
                addCaption(sheet, i, 4, "O");
            }
        }
        //addCaption(sheet, 0, 0, "Header 1");
        //addCaption(sheet, 1, 0, "This is another header");


    }

    private void createContent(WritableSheet sheet, List<List<Double>> similarityMatrix) throws WriteException, RowsExceededException {
        // Write a few number
        for (int i = 0; i < similarityMatrix.size(); i++) {
            for (int j = 0; j < similarityMatrix.get(i).size(); j++){
                addNumber(sheet, i + 1, j + 1, similarityMatrix.get(i).get(j));
            }
        }

        /*
        // Lets calculate the sum of it
        StringBuffer buf = new StringBuffer();
        buf.append("SUM(A2:A10)");
        Formula f = new Formula(0, 10, buf.toString());
        sheet.addCell(f);
        buf = new StringBuffer();
        buf.append("SUM(B2:B10)");
        f = new Formula(1, 10, buf.toString());
        sheet.addCell(f);
        */
        /*
        // now a bit of text
        for (int i = 12; i < 20; i++) {
            // First column
            addLabel(sheet, 0, i, "Boring text " + i);
            // Second column
            addLabel(sheet, 1, i, "Another text");
        }
        */
    }

    private void addCaption(WritableSheet sheet, int column, int row, String s) throws RowsExceededException, WriteException {
        Label label;
        label = new Label(column, row, s, timesBoldUnderline);
        sheet.addCell(label);
    }

    private void addNumber(WritableSheet sheet, int column, int row, Double num) throws WriteException, RowsExceededException {
        Number number;
        number = new Number(column, row, num, times);
        sheet.addCell(number);
    }

    private void addLabel(WritableSheet sheet, int column, int row, String s) throws WriteException, RowsExceededException {
        Label label;
        label = new Label(column, row, s, times);
        sheet.addCell(label);
    }

    public static void main(String[] args) throws WriteException, IOException {
        WriteExcel test = new WriteExcel();
        test.setOutputFile("E:/lars.xls");
       // test.write();
        System.out
                .println("Please check the result file under c:/temp/lars.xls ");
    }
}